#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
AI营销方案生成系统 - 数据模型模块
提供MongoDB文档模型和数据访问对象

主要功能：
- MongoDB文档模型定义
- 数据验证和序列化
- 数据访问对象(DAO)
- 模型关系管理

设计原则：
- 单一职责：每个模型只负责一个业务实体
- 数据完整性：通过验证确保数据一致性
- 可扩展性：支持模型继承和扩展
- 性能优化：合理使用索引和查询优化

Author: AI Marketing System
Date: 2024
"""

# 导入基础模型类
from .base import BaseModel, BaseDAO

# 导入具体模型类
from .template import Template, TemplateDAO
from .requirement import Requirement, RequirementDAO
from .chat_session import ChatSession, ChatSessionDAO
from .chat_message import ChatMessage, ChatMessageDAO

# 模型注册表
MODEL_REGISTRY = {
    'template': Template,
    'requirement': Requirement,
    'chat_session': ChatSession,
    'chat_message': ChatMessage
}

# DAO注册表
DAO_REGISTRY = {
    'template': TemplateDAO,
    'requirement': RequirementDAO,
    'chat_session': ChatSessionDAO,
    'chat_message': ChatMessageDAO
}


def get_model(model_name: str):
    """
    根据模型名称获取模型类
    
    Args:
        model_name: 模型名称
        
    Returns:
        模型类
        
    Raises:
        ValueError: 模型不存在
    """
    if model_name not in MODEL_REGISTRY:
        raise ValueError(f"模型 '{model_name}' 不存在")
    return MODEL_REGISTRY[model_name]


def get_dao(dao_name: str):
    """
    根据DAO名称获取DAO类
    
    Args:
        dao_name: DAO名称
        
    Returns:
        DAO类
        
    Raises:
        ValueError: DAO不存在
    """
    if dao_name not in DAO_REGISTRY:
        raise ValueError(f"DAO '{dao_name}' 不存在")
    return DAO_REGISTRY[dao_name]


def get_dao_instance(dao_name: str):
    """
    根据DAO名称获取DAO实例
    
    Args:
        dao_name: DAO名称
        
    Returns:
        DAO实例
        
    Raises:
        ValueError: DAO不存在
    """
    dao_class = get_dao(dao_name)
    return dao_class()


def init_models():
    """
    初始化所有模型
    创建索引和约束
    """
    from core import get_db
    
    db = get_db()
    if not db:
        raise RuntimeError("数据库连接未初始化")
    
    # 初始化每个模型的索引
    for model_name, model_class in MODEL_REGISTRY.items():
        if hasattr(model_class, 'create_indexes'):
            try:
                model_class.create_indexes(db)
                print(f"模型 {model_name} 索引创建成功")
            except Exception as e:
                print(f"模型 {model_name} 索引创建失败: {e}")


def validate_all_models():
    """
    验证所有模型的完整性
    
    Returns:
        dict: 验证结果
    """
    results = {}
    
    for model_name, model_class in MODEL_REGISTRY.items():
        try:
            # 检查模型是否有必要的方法
            required_methods = ['to_dict', 'from_dict', 'validate']
            missing_methods = []
            
            for method in required_methods:
                if not hasattr(model_class, method):
                    missing_methods.append(method)
            
            if missing_methods:
                results[model_name] = {
                    'valid': False,
                    'error': f"缺少方法: {', '.join(missing_methods)}"
                }
            else:
                results[model_name] = {
                    'valid': True,
                    'error': None
                }
                
        except Exception as e:
            results[model_name] = {
                'valid': False,
                'error': str(e)
            }
    
    return results


def get_model_stats():
    """
    获取模型统计信息
    
    Returns:
        dict: 统计信息
    """
    from core import get_db
    
    db = get_db()
    if not db:
        return {}
    
    stats = {}
    
    for model_name, model_class in MODEL_REGISTRY.items():
        try:
            collection_name = getattr(model_class, 'collection_name', model_name + 's')
            collection = db[collection_name]
            
            # 获取文档数量
            count = collection.count_documents({})
            
            # 获取集合统计信息
            collection_stats = db.command('collStats', collection_name)
            
            stats[model_name] = {
                'count': count,
                'size': collection_stats.get('size', 0),
                'avg_obj_size': collection_stats.get('avgObjSize', 0),
                'indexes': len(collection_stats.get('indexSizes', {})),
                'collection_name': collection_name
            }
            
        except Exception as e:
            stats[model_name] = {
                'error': str(e)
            }
    
    return stats


# 导出的模型类和函数
__all__ = [
    # 基础类
    'BaseModel',
    'BaseDAO',
    
    # 模型类
    'Template',
    'Requirement',
    'ChatSession',
    'ChatMessage',
    
    # DAO类
    'TemplateDAO',
    'RequirementDAO',
    'ChatSessionDAO',
    'ChatMessageDAO',
    
    # 注册表
    'MODEL_REGISTRY',
    'DAO_REGISTRY',
    
    # 工具函数
    'get_model',
    'get_dao',
    'get_dao_instance',
    'init_models',
    'validate_all_models',
    'get_model_stats'
]

# 版本信息
__version__ = '1.0.0'
__author__ = 'AI Marketing System'
__description__ = 'Data model module for AI Marketing System'